home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル実用編
/
チャート
/
CHART.C
next >
Wrap
Text File
|
1994-03-10
|
9KB
|
322 lines
/******************************************************************************
* chart.c: チャートの処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "chart.h" /* このプログラム固有のヘッダファイル */
#include "csfile.h" /* 小遣い帳データファイルのヘッダファイル */
/******************************************************************************
* opening(): データファイルの存在を確認する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 存在する
* = FALSE: 存在しない
*/
BOOLEAN opening(ComVal *pcv)
{
int errCode;
char *fep;
char pathName[128];
Task task; /* タスク管理レコード */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
strcpy(pathName, task.name);
/* フルパス名よりファイル名の先頭を求める */
SXSearchFname(pathName, &fep);
fep[0] = 0;
/* データファイルをサーチ */
errCode = TSSearchFile(DATA_FNODE DATA_FEXT, pcv->fileName, pathName);
if (errCode < 0) {
/* データファイルが見付からない場合 */
DMError(D_CONFIRM, "データファイルが見付かりません。");
return FALSE;
}
return TRUE;
}
/******************************************************************************
* getMaxDay(): 指定月の全日数を返す
******************************************************************************
* 引数: int month 指定の月
* 戻り値: int days 日数
* 注釈: 月の値が1~12でないときは0を返します。
*/
int getMaxDay(int month)
{
int days = 0;
switch (month) {
case 1: /* 31日まである月 */
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4: /* 30日まである月 */
case 6:
case 9:
case 11:
days = 30;
break;
case 2: /* 2月は28日まで閏年は無視 */
days = 28;
break;
}
return days;
}
/******************************************************************************
* lastMonth(): 入力の月の1月前の月を返す
******************************************************************************
* 引数: int mon 指定の月
* 戻り値: int 1ヶ月前の月
*/
int lastMonth(int mon)
{
/* 1引く */
mon--;
/* 0以下になったら12たす */
if (mon < 1)
mon += 12;
return mon;
}
/******************************************************************************
* getDate(): 月日をシステムから取得する
******************************************************************************
* 引数: int *month 月を格納するポインタ
* int *day 日を格納するポインタ
*/
void getDate(int *month, int *day)
{
time_t gdate; /* 標準時間からの経過時間 */
struct tm *date; /* tm構造体へのポインタ */
/* OSから現在の日時を取得する */
gdate = time(NULL);
date = gmtime(&gdate);
/* 今日の日付 */
*month = date->tm_mon + 1;
*day = date->tm_mday;
}
/******************************************************************************
* drawTextArea(): テキスト表示部分のバックグラウンドの描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawTextArea(ComVal *pcv)
{
int oldfc, oldbc, oldpm;
Region **rgnHdl;
/* テキストモードに設定する */
setGraph(pcv, G_TXT);
/* レクタングルの描画 */
rgnHdl = GMNewRgn();
if (rgnHdl == NULL) {
DMError(D_CONFIRM, "メモリが確保できません。");
return;
}
/* 描画属性 */
oldfc = GMForeColor(G_LGRAY);
oldbc = GMBackColor(G_THRU);
oldpm = GMPenMode(G_PSET);
GMRectRgn(rgnHdl, &pcv->windowPtr->graph.rect);
GMDiffRectRgn(rgnHdl, rgnHdl, &rcGraph);
GMFillRgn(rgnHdl);
GMDisposeRgn(rgnHdl); /* リージョンハンドルを解放する */
GMShadowRect(&rcGraph);
/* 描画属性を元に戻す */
GMForeColor(oldfc);
GMBackColor(oldbc);
GMPenMode(oldpm);
}
/******************************************************************************
* clearDisp(): 画面の消去
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void clearDisp(ComVal *pcv)
{
int oldpm, oldfc; /* デフォルトのペンモード */
oldpm = GMPenMode(G_PSET);
oldfc = GMForeColor(GC_WHITE);
GMFillRect(&rcGraph);
/* 描画属性をデフォルトの値にする */
GMPenMode(oldpm);
GMForeColor(oldpm);
}
/******************************************************************************
* readData(): 全データを読み込む
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
*/
BOOLEAN readData(ComVal *pcv)
{
int i, j;
/* データ格納領域をクリアする */
for (i = 0; i < 12; i++)
for (j = 0; j < 7; j++)
pcv->money[i][j] = 0;
/* 各月の合計を配列に登録する */
for (i = 1; i < 13; i++)
if (!sumMonth(pcv, i, pcv->money[i - 1], &pcv->sum[i - 1]))
return FALSE;
return TRUE;
}
/******************************************************************************
* sumMonth(): ひと月のデータの合計を取得する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int month 月
* int *tMoney 金額格納バッファへのポインタ
* int *sum 合計の金額を格納するポインタ
* 戻り値: BOOLEAN = TRUE: 合計の計算に成功
* = FALSE: 合計の計算ができなかった
*/
BOOLEAN sumMonth(ComVal *pcv, int month, int *tMoney, int *sum)
{
int i, max, day;
BOOLEAN ret = TRUE;
short index[512];
KZDATA kzbuff; /* データバッファ */
/* データをクリアする */
*sum = 0;
for (i = 0; i < 7; i++)
tMoney[i] = 0;
/* データ位置テーブルを読み込む */
if (!readTable(pcv, index))
/* データ位置テーブルが読み込めなかった */
return FALSE;
/* ループ数を求める */
max = getMaxDay(month);
/* 1月分データの合計を求める */
for (day = 1; day <= max; day++) {
if (index[(month - 1) * 32 + (day - 1)] != -1) {
/* データが存在した場合だけディスクからロード */
ret = loadFile(pcv, month, day, &kzbuff.money[0]);
if (!ret)
/* 読み込みエラー発生 */
break;
/* 項目ごとにデータを加算 */
for (i = 0; i < 7; i++)
tMoney[i] += kzbuff.money[i];
}
}
/* 合計を計算 */
for (i = 0; i < 7; i++)
*sum += tMoney[i];
return ret;
}
/******************************************************************************
* drawStrM(): 指定座標を中心に文字列を描画する
******************************************************************************
* 引数: char *pstr 表示文字列
* LPoint lpt ペン位置
*
*/
void drawStrM(char *pstr, LPoint lpt)
{
Point pt;
pt.x_y = lpt;
pt.p.x -= LOWWORD(GMStrWidth(pstr, 0, (int) strlen(pstr))) / 2;
pt.p.y -= LOWWORD(GMFontInfo()) / 2;
drawStrZ(pstr, pt.x_y); /* 文字列を描画する */
}
/******************************************************************************
* drawStrZ(): 指定の位置への文字列の描画
******************************************************************************
* 引数: char *pstr 表示文字列
* LPoint lpt ペン位置
*/
void drawStrZ(char *pstr, LPoint lpt)
{
GMMove(lpt); /* ペンを指定の位置へ移動する */
GMDrawStrZ(pstr); /* 文字列を描画する */
}
/******************************************************************************
* changeData(): データ変更の手続きをする
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* 小遣い帳.Xよりデータファイルの変更の通知を受けグラフの表示を変更
*/
void changeData(ComVal *pcv)
{
int tmonth;
int mon1, mon2, mon3; /* 現在の1、2、3ヶ月前の月 */
BOOLEAN drawFlag = FALSE;
/* 変更月の合計を再計算 */
tmonth = pcv->event.ts.whom;
sumMonth(pcv, tmonth, pcv->money[tmonth - 1], &pcv->sum[tmonth - 1]);
/* 現在の状態により振り分ける */
switch (pcv->kind) {
case GK_CRCL: /* 円グラフのとき */
/* 合計が0であればデータなしと判断 */
if (pcv->sum[tmonth - 1] == 0) {
/* メッセージ表示 */
DMError(D_CONFIRM, "当月データがありません。");
/* フラグを初期状態に戻す */
pcv->kind = GK_INIT;
drawFlag = TRUE;
break;
}
/* この処理は下に続きます */
case GK_RADAR: /* レーダーチャートのとき */
/* 再描画の必要がある場合のみ再描画 */
if (pcv->month == tmonth)
drawFlag = TRUE;
break;
case GK_BAR: /* 棒グラフのとき */
case GK_LINE: /* 折れ線グラフのとき */
/* 1、2、3ヶ月前の月の取得 */
mon1 = lastMonth(pcv->month);
mon2 = lastMonth(mon1);
mon3 = lastMonth(mon2);
/* 合計値の変更 */
/* 再描画の必要がある場合のみ再描画 */
if (tmonth == pcv->month || tmonth == mon1 || tmonth == mon2 || tmonth == mon3)
drawFlag = TRUE;
break;
}
if (drawFlag)
addUpdate(pcv->windowPtr, &rcGraph); /* 描画する */
}